package com.autotag.nlp;

import java.io.IOException;

import edu.stanford.nlp.tagger.maxent.MaxentTagger;

/**
 * 词性标注
 * 直接利用Stanford posttagger进行标注
 * Stanford posttagger提供两种方式的标注
 * 1）bidirectional-distsim
 * 2）left3words
 * 前者准确率较高，速度较慢
 * 后者准确率稍低，速度较快
 * 
 * @author Wang Leye
 *
 */
public class PartOfSpeechTagger {
	private MaxentTagger tagger;
//	private static final String DEFAULT_TAGGER_MODEL_PATH = 
//		"models/bidirectional-distsim-wsj-0-18.tagger";
	private static final String DEFAULT_TAGGER_MODEL_PATH = 
		"models/left3words-wsj-0-18.tagger";
	
	/**
	 * 构造函数
	 * 
	 * @param modelPath Tagger所使用的训练好的模型所在的路径，
	 * 例如"d:/nlp/models/bidirectional-distsim-wsj-0-18.tagger"，
	 * 如果此参数为null或空串，则使用项目models目录下的默认模型bidirectional-distsim-wsj-0-18.tagger
	 */
	public PartOfSpeechTagger(String modelPath) {
		if (modelPath == null || modelPath.isEmpty())
			modelPath = DEFAULT_TAGGER_MODEL_PATH;
		try {
			tagger = 
				new MaxentTagger(modelPath);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 默认构造函数，使用项目目录models之下的bidirectional-distsim-wsj-0-18.tagger模型。
	 * 如果需要明确指明模型所在的路径，请使用其他构造函数
	 */
	public PartOfSpeechTagger() {
		this(DEFAULT_TAGGER_MODEL_PATH);
	}
	
	/**
	 * 将一段文本加上词性标注
	 * @param toTag 要标注的文本
	 * @return
	 */
	public String tagString(String toTag) {
		if (toTag == null)
			return null;
		return tagger.tagString(toTag);
	}
	
	/**
	 * 测试代码
	 * @param args
	 */
	public static void main (String[] args) {
//		final String MODEL_HOME_PATH = 
//			"D:/Softwares for work/NLP/stanford-postagger-2010-05-26/models";
		String testStrs[] = {
				"University Course"
		};
		
		PartOfSpeechTagger tagger = 
			new PartOfSpeechTagger();
		for (String testStr: testStrs)
			System.out.println(tagger.tagString(testStr));
	}
}
